翻轉電子書系列:Java 程式設計()含物件導向 描述: 回首頁.png 

描述: 粘_4.png翻轉工作室:粘添壽

 

第二章  一維陣列

2-1 一維陣列

2-1-1 一維陣列結構

陣列(Array)是一群相同『資料型態』的變數整合而成的另一種變數,並使用一個共用的參考名稱。其中『資料型態』可以是一般基本資料型態(如 intfloatdouble...等),也可以是一個『物件』型態(如 String...等)。

如圖 2-1 所示(一維陣列結構),陣列 a 包含了 8 個相同資料型態(int)的變數(稱之有 8 個元素),這些變數各自獨立的,也可分別儲存資料,之間並不相衝突;但為了使這些資料之間也某些連帶關係,利用相同的變數名稱(如 a),各自給予獨立的指標(a[i]i = 0, …, 7),並自動產生 a.length 表示該陣列元素的個數。

2-1 一維陣列結構

對資料整合與運用(如資料結構)而言,陣列是非常重要的資料型態,可用來描述許多真實環境的現象。本章先介紹一些陣列的基本觀念與運用。

2-1-2 陣列動態宣告

『一維陣列』(One dimension array)表示僅有一行或一列的資料結構,但一列陣列可能包含若干個行;一行陣列也可能包含多個列之結構,如圖 2-1 所示。一維陣列僅需要一個指標變數(如 i)來索引陣列中哪一個元素(如 a[i]i = 3)。Java 語言宣告陣列的基本語法說明如下:

其實在 Java 語言裡,無論哪一種基本資料型態,或以宣告完成的物件,它都是以物件的觀念來處理,尤其在陣列資料型態裡更是明顯。如同物件一樣,宣告某一陣列變數,只不過產生了資料型態架構,必須再經由 new 敘述才能在主記憶體裡取得變數空間。基本語法如下:

陣列宣告的語法:

 範例:

Data_type Array_name[];

Array_name = new Data_type[number];

int course[];

course = new int[20];

Data_type[] Array_name = new Data_type[num];

Array_name.length() = num;

int [] course =new int [20];

course.length = 20;

第一個敘述(如 int course[])功能是宣告某一變數(course)為整數(int)的陣列變數;第二個敘述(如 course = new int[20])功能是由主記憶體取得 20 個整數空間,並配置給 course 變數使用。此兩條敘述執行完畢後,則產生 course[0]course[1]...等、course[19];需注意陣列指標是由 0 開始計算,如有 n 個元素,則最高指標是 n-1 另外,系統也會自動產生 length 變數,紀錄該變數的長度如何,如 course = int[20],則 course.length = 20。上述範例亦可簡寫成 int[] course = new int[20],一行敘述句完成宣告。

2-1-3 陣列宣告並給予初值

宣告陣列時可以給予初值,則表示由記憶體取得空間後立即存入初值數值,陣列的大小就如此被固定下來(length 變數內容),也不需再由 new 敘述來配置空間。語法格式如下:

陣列宣告並給予初值:

 範例:

Data_type Array_name[] = { …};

int course[] = {89, 90, 60, 70, 80};

// course.length = 5

上述執行後,會產生 5 個元素,分別是 course[0] = 89course[1] = 90course[2] = 60course[3] = 70 course[4] = 80,以及 course.length = 5。吾人還是取用更多範例說明如下:

陣列宣告範例:

說明:

float weight[];

weight = new float[30]

宣告 weight 陣列變數為浮點數型態。

產生 30 個浮點數元素;weight.length=30

float weight = new float[30];

同上

String[] names;

names = String[20];

宣告 names 陣列變數為字串型態。

產生 20 個字串元素;names.length=20

char keys[] = {‘A’, ‘B’, ‘C’};

宣告產生字元陣列,並給初值。

2-2 一維陣列運用

2-2-1 範例研討:印出股票歷史價

A)程式功能:Ex2_1.java

吾人利用陣列 course[] = {78.8, 72.3, 61, 56, 87, 66.3, 74.5, 88, 76, 58}; 儲存某一支股票最近 10 個交易日的收盤價,請列印出其內容;期望操作介面如下:

B)製作技巧研討:

陣列中每一個元素都是獨立變數,必須利用指標變數一個接一個取出再列印。本範例 course[] 包含了 10= course.length)個元素,則利用指標 i = 0, 1, …, 9,分別索引每一元素 course[i] 的內容。譬如,當 count =0,則 course[0] = 78.8count=1,則course[1] = 72.3,依此類推。因此,吾人可利用 for 迴圈,條件初始值為 i = 0、判斷條件 count < course.length、增減量為 i++

C)程式範例:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

//Ex2_1.java

 

public class Ex2_1 {

     public static void main(String args[]) {

          double course[]={78.8, 72.3, 61, 56, 87,

                        66.3, 74.5, 88, 76, 58};

 

          /* course[0]~ course[course.length-1] 列印陣列 */

          for(int i=0; i<course.length; i++)

              System.out.printf("%.2f  ", course[i]);

          System.out.printf("\n");           // 列印完畢, 換行

     }

}

D)程式重點分析:

2-2-2 範例研討:印出平均股價

A)程式功能:Ex2_2.java

請修改 Ex2_1.java 程式,使其功能不但輸出最近 10 個交易日的收盤價,並計算出他的平均價如何。【利用陣列 course[] = {78.8, 72.3, 61, 56, 87, 66.3, 74.5, 88, 76, 58}; 儲存某一支股票最近 10 個交易日的收盤價】,期望操作介面如下:

78.80  72.30  61.00  56.00  87.00  66.30  74.50  88.00  76.00  58.00 

最近 10 天的平均價 = 71.79

B)程式範例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//Ex2_2.java

/* 吾人利用陣列 course[]={78.8,72.3,61,56,87,66.3,74.5,88.76.58}

* 儲存某一支股票最近10個交易日的收盤價,請計算它的平均價 */

 

public class Ex2_2 {

   public static void main(String args[]) {

        double course[]={78.8, 72.3, 61, 56, 87,

                         66.3, 74.5, 88, 76, 58};

        double sum=0, ave;

        for(int i=0; i<course.length; i++) {

          System.out.printf("%.2f  ", course[i]);

          sum = sum + course[i];

        }

        System.out.printf("\n");

        ave = sum /course.length;

        System.out.printf("最近 10 天的平均價 = %.2f", ave);

   }

}

2-2-3 自我挑戰:印出最高與最低股價

A)程式功能:PM2_1.java

請修改 Ex2_1.java 程式,使其功能不但輸出最近 10 個交易日的收盤價,並比較輸出其中最高與最低價格如何。【利用陣列 course[] = {78.8, 72.3, 61, 56, 87, 66.3, 74.5, 88, 76, 58}; 儲存某一支股票最近 10 個交易日的收盤價】,期望操作介面如下:

78.80  72.30  61.00  56.00  87.00  66.30  74.50  88.00  76.00  58.00 

最近 10 天的最高價格 = 88.00

最近 10 天的最低價格 = 56.00

B)程式設計技巧:(程式片段)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class PM2_1 {

   public static void main(String args[]) {

// 這是程式片段

        double Max=0.0, Min=9999.9;

        for(int i=0; i<course.length; i++) {

          System.out.printf("%.2f  ", course[i]);

          if (Max < course[i])

                  Max = course[i];

          if (Min > course[i])

                  Min = course[i];

        }

……// 這是程式片段

   }

}

2-3 線性搜尋法

2-3-1 線性搜尋演算法

從陣列內尋找某一筆資料,最簡單的方法是線性搜尋法(Linear Serach);演算法是由陣列的起頭開始比較尋找(比較內容),如搜尋到則立即停止,否則繼續往下一個元素尋找,一直到陣列結束為止,如圖 7-5 所示。線性演算法所處理的陣列不需要特殊處理(如由大到小排列),最佳狀況是第一筆資料就找到;最差狀態是最後一筆資料才搜尋到。

2-2 線性搜尋法的運作


2-3-2 範例研討:實現線性搜尋法

吾人利用 num[] 陣列儲存 10 個整數,輸入一個整數來查詢是否在 num  內,再顯示其執行結果,如下:

num[] = 20   13   45   24   42   34   22   89   19   70  

請輸入一個數值 =>17

17 不在 num 陣列內

num[] = 20   13   45   24   42   34   22   89   19   70  

請輸入一個數值 =>24

24 找到了

B)程式範例:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

import java.util.Scanner;

public class Ex2_3 {

    public static void main(String args[]) {

      Scanner keyin = new Scanner(System.in);

          int value, flag=0, i;              

          int[] num = {20, 13, 45, 24, 42, 34, 22, 89, 19, 70};

          System.out.printf("num[] = ");

          for (int k=0; k<10; k++)

                System.out.printf("%d   ", num[k]);

          System.out.printf("\n");

          System.out.printf("請輸入一個數值 =>");

          value = keyin.nextInt();

          i=0;

          while (i < 10) {

                if (value == num[i]){

                        flag = 1;

                        break;

                }

                i++;

          }

          if(flag == 1)

                 System.out.printf("num[%d] = %d 找到了\n", i, value);

          else

            System.out.printf("%d 不在 num 陣列內", value);

    }

}

2-3-3 範例研討:大樂透電腦選號

A)程式功能:Ex2-4.java

請製作大樂透的電腦選號系統,系統能自動選出 6 個由 01 ~ 49 號碼,但這六個號碼都不可以重複。期望操作介面如下:

B)製作技巧研討:

編寫一個產生 6 個隨機亂數的程式並不困難,但如果要這 6 個亂數不重複的話,不加點小技巧是不行的。首先準備一個 6 個元素的陣列(int[] num = new int[6];),每次隨機選出號碼後,立即比較陣列內是否有重複號碼(之前所取的),如果沒有則加入該陣列內。第 1 次選出號碼(i=0),陣列還是空的(j=0),則幾乎不用比對;如已選出 3 個號碼,下一個選出號碼就必須比對之前 3 個號碼是否有重複,依此類推。最後再印出以選出的 6 個號碼。

C)程式範例:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

//Ex2-4.java

 

import java.lang.Math;

public class Ex2_4 {

    public static void main(String args[]) {

          int value;                // 隨機選取號碼

          int[] num = new int[6];     // 儲存選取號碼

          int i=0;

          while (i < 6) {

              flag=0;

              value = 1 + (int)(Math.random()*46);

              for (int j=0; j<i; j++) {      // 檢視已選出的號碼

                  if (value == num[j]) {   // 是否重複

                      flag = 1;        // 重複則放棄重來

                      break;

                 }

              }

              if (flag == 0) {

                 num[i] = value;      // 沒重複則填入陣列

                 i = i+1;

              }

          }

          System.out.printf("幸運號碼是: ");

          for (i=0; i<6; i++)

              System.out.printf("%d  ", num[i]);

          System.out.printf("\n");

    }

}

D)程式重點分析